package com.lyq.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据库操作封装
 */
public class DBMySql {
    private final static Connection con = DBUtils.con;

    /**
     * 查询
     * @param sql 要执行的 SQL 查询语句
     * @param params 用于填充 SQL 语句中参数占位符的可变参数，按顺序对应占位符
     * @return 执行查询后得到的结果集（ResultSet），若发生异常则返回 null
     */
    public static ResultSet query(String sql,String ...params) {
        try {
            // 预编译sql
            PreparedStatement pstmt = con.prepareStatement(sql);

            for(int i=0;i<params.length;i++) {
                pstmt.setString(i+1, params[i]);
            }

            // 执行sql，返回结果集
            return pstmt.executeQuery();

        } catch (SQLException e) {
            return null;
        }
    }

    /**
     * 更新
     * @param sql 要执行的 SQL 查询语句
     * @param params 用于填充 SQL 语句中参数占位符的可变参数，按顺序对应占位符
     * @return -1 报错 0 修改失败
     */
    public static int update(String sql,String ...params) {
        try {
            // 预编译sql
            PreparedStatement pstmt = con.prepareStatement(sql);

            for(int i=0;i<params.length;i++) {
                pstmt.setString(i+1, params[i]);
            }
            // 执行sql，返回结果
            return pstmt.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }


    /**
     * 查询所有
     * @param sql 要执行的 SQL 查询语句
     * @param tclass 类体
     * @param params 用于填充 SQL 语句中参数占位符的可变参数，按顺序对应占位符
     * @return 返回查询到的学生列表
     * @param <T> 类体
     */
    public static <T> List<T> queryAll(String sql, Class<T> tclass, Object ...params) {

        List<T>list=new ArrayList<>();
        try {

            // 预编译sql
            PreparedStatement pstmt=con.prepareStatement(sql);

            // sql参数设置
            for(int i=0;i<params.length;i++) {
                pstmt.setObject(i + 1, params[i]);
            }

            // 执行sql，获得结果集
            ResultSet resultSet = pstmt.executeQuery();

            while(resultSet.next()) {

                // 创建传入的类的实例
                T instance=tclass.getDeclaredConstructor().newInstance();

                // 获取类当中的所有字段
                Field[] fields = tclass.getDeclaredFields();

                // 遍历字段
                for (Field field : fields) {

                    // 允许访问私有字段
                    field.setAccessible(true);

                    // 从结果集中获取该字段名对应的值
                    String res=resultSet.getString(field.getName());

                    // 将获取到的值设置到对象的对应字段上
                    field.set(instance,res);
                }

                // 将填充好数据的实例添加到结果列表中
                list.add(instance);
            }
        } catch (SQLException | InvocationTargetException | InstantiationException | IllegalAccessException |
                 NoSuchMethodException e) {
            throw new RuntimeException(e);
        }

        // 返回查询到的学生列表
        return list;
    }

}
